package com.gitee.dolt.core.context;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 获取当前线程变量中的 用户id、用户昵称、账号等信息
 *
 * @author LYH
 */
public final class ContextUtil {
    private ContextUtil() {
    }

    //
    private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new ThreadLocal<>();

    public static void set(String key, Object value) {
        Map<String, Object> map = getLocalMap();
        map.put(key, value);
    }

    public static <T> T get(String key, Class<T> type) {
        Map<String, Object> map = getLocalMap();
        return Convert.convert(type, map.get(key));
    }

    public static <T> T get(String key, Class<T> type, Object def) {
        Map<String, Object> map = getLocalMap();
        return Convert.convert(type, map.getOrDefault(key, def));
    }

    public static Object get(String key) {
        Map<String, Object> map = getLocalMap();
        return map.get(key);
    }

    public static Map<String, Object> getLocalMap() {
        Map<String, Object> map = THREAD_LOCAL.get();
        if (map == null) {
            // 设置值为空也会报NullException
            map = new ConcurrentHashMap<>(10);
            THREAD_LOCAL.set(map);
        }
        return map;
    }

    public static void setLocalMap(Map<String, Object> localMap) {
        THREAD_LOCAL.set(localMap);
    }


    /**
     * 用户ID
     *
     * @return 用户ID
     */
    public static Long getUserId() {
        return get(ContextConstants.JWT_KEY_USER_ID, Long.class, 0L);
    }

    public static String getUserIdStr() {
        return String.valueOf(getUserId());
    }

    /**
     * 用户ID
     *
     * @param userId 用户ID
     */
    public static void setUserId(Long userId) {
        set(ContextConstants.JWT_KEY_USER_ID, userId == null ? 0 : userId);
    }

    public static void setUserId(String userId) {
        set(ContextConstants.JWT_KEY_USER_ID, StrUtil.nullToEmpty(userId));
    }

    /**
     * 登录账号
     *
     * @return 登录账号
     */
    public static String getAccount() {
        return get(ContextConstants.JWT_KEY_ACCOUNT, String.class);
    }

    /**
     * 登录账号
     *
     * @param account 登录账号
     */
    public static void setAccount(String account) {
        set(ContextConstants.JWT_KEY_ACCOUNT, StrUtil.nullToEmpty(account));
    }


    /**
     * 用户姓名
     *
     * @return 用户姓名
     */
    public static String getName() {
        return get(ContextConstants.JWT_KEY_NAME, String.class);
    }

    /**
     * 用户姓名
     *
     * @param name 用户姓名
     */
    public static void setName(String name) {
        set(ContextConstants.JWT_KEY_NAME, StrUtil.nullToEmpty(name));
    }

    /**
     * 用户范围
     *
     * @return 用户范围
     */
    public static String getScope() {
        return get(ContextConstants.JWT_KEY_SCOPE, String.class);
    }

    /**
     * 用户姓名
     *
     * @param scope 用户范围
     */
    public static void setScope(String scope) {
        set(ContextConstants.JWT_KEY_SCOPE, StrUtil.nullToEmpty(scope));
    }

    /**
     * 用户角色
     *
     * @return 用户角色
     */
    public static List<String> getRoles() {
        return get(ContextConstants.JWT_KEY_ROLE, List.class, Collections.emptyList());
    }

    /**
     * 用户角色
     *
     * @param roles 用户角色
     */
    public static void setRoles(List<String> roles) {
        set(ContextConstants.JWT_KEY_ROLE, roles == null ? Collections.emptyList() : roles);
    }

    /**
     * 用户权限
     *
     * @return 用户权限
     */
    public static List<String> getResources() {
        return get(ContextConstants.JWT_KEY_RESOURCE, List.class, Collections.emptyList());
    }

    /**
     * 用户权限
     *
     * @param resources 用户权限
     */
    public static void setResources(List<String> resources) {
        set(ContextConstants.JWT_KEY_RESOURCE, resources == null ? Collections.emptyList() : resources);
    }


    /**
     * 获取token
     *
     * @return token
     */
    public static String getToken() {
        return get(ContextConstants.BEARER_HEADER_KEY, String.class);
    }

    public static void setToken(String token) {
        set(ContextConstants.BEARER_HEADER_KEY, StrUtil.nullToEmpty(token));
    }

    public static void remove() {
        THREAD_LOCAL.remove();
    }

    /**
     * 获取租户编码
     *
     * @return 租户编码
     */
    public static String getTenant() {
        return get(ContextConstants.JWT_KEY_TENANT, String.class, StrUtil.EMPTY);
    }

    public static void setTenant(String val) {
        set(ContextConstants.JWT_KEY_TENANT, val);
    }
}
